import axios from 'axios'
import type { AxiosRequestConfig, AxiosResponse } from 'axios'
import { isDevelopment, isH5 } from './platform'
import type { Data } from '@/types/common'
import env from '@/config/env'
import useAppStore from "@/stores/modules/app"

const baseURL = isH5 && isDevelopment ? '/api' : env.apiBaseUrl
let loadingCount = 0
const appStore = useAppStore()

// 模拟加载动画
const showLoading = (isShow: boolean) => {
  if (isShow) {
    loadingCount++
    // uni.showLoading({ title: '加载中...' })
  }
}
const hideLoading = () => {
  loadingCount--
  if (loadingCount <= 0) {
    // uni.hideLoading()
  }
}

// 添加 Axios 实例
const httpInstance = axios.create({
  baseURL,
  timeout: 10000, // 请求超时，默认10秒
})

// 请求拦截器
httpInstance.interceptors.request.use(
  (config) => {
    if (!config.headers) {
      config.headers = new axios.AxiosHeaders()
    }

    // 1. 添加小程序端请求头标识
    // config.headers['source-client'] = 'miniapp'

    // 2. 添加 token
    const token = appStore.token
    if (token) {
      config.headers.token = `${token}`
    }

    // 3. 显示加载动画
    if ((config.data as Record<string, any>)?.isLoad !== false) {
      showLoading(true)
    }

    // console.log('请求拦截', config)
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
httpInstance.interceptors.response.use(
  (response: AxiosResponse) => {
    hideLoading()
    // 2xx 状态码
    // console.log('请求成功', response)
    return response.data
  },
  (error) => {
    hideLoading()
    if (error.response) {
      const { status, data } = error.response
      if (status === 401) {
        // 401错误处理：清理用户信息，跳转登录页
        // const memberStore = useUserInfoStore()
        // memberStore.clearProfile()
        // uni.navigateTo({ url: '/pages/login/login' })
      } else {
        // 其他错误：后端返回的信息提示
        // uni.showToast({
        //   icon: 'none',
        //   title: data.msg || '请求错误',
        // })
      }
    } else {
      // 网络错误
      // uni.showToast({
      //   icon: 'none',
      //   title: '网络错误，换个网络试试',
      // })
    }
    return Promise.reject(error)
  }
)

/**
 * 请求函数
 * @param options - AxiosRequestConfig 请求配置
 * @returns Promise
 */
export const http = <T>(options: AxiosRequestConfig) => {
  return new Promise<Data<T>>((resolve, reject) => {
    httpInstance(options)
      .then((res) => {
        resolve(res as unknown as Data<T>) // 提取核心数据，支持泛型
      })
      .catch((error) => {
        reject(error)
      })
  })
}
